#函数定义
# def mylen():
#     """计算s1的长度"""
#     s1 = "hello world"
#     length = 0
#     for i in s1:
#         length= length+1
#     print(length)

#函数调用
# str_len = mylen()
#因为没有返回值，此时的str_len为None
# print('str_len : %s'%str_len)


"""
只写return，后面不写其他内容，也会返回None，
有的同学会奇怪，既然没有要返回的值，完全可以不写return，
为什么还要写个return呢？这里我们要说一下return的其他用法，就是一旦遇到return，结束整个函数。
#return None：和上面的两种情况一样，我们一般不这样写。
"""



# def ret_demo1():
#     '''返回多个值'''
#     return 1,2,3,4

#
# def ret_demo2():
#     '''返回多个任意类型的值'''
#     return 1,['a','b'],3,4
#
# ret1 = ret_demo1()
# print(ret1)
# ret2 = ret_demo2()
# print(ret2)
#
# #返回的多个值会被组织成元组被返回，也可以用多个值来接收
# def ret_demo2():
#     return 1,['a','b'],3,4
#
# #返回多个值，用一个变量接收
# ret2 = ret_demo2()
# print(ret2)
#
# #用多个值接收返回值：返回几个值，就用几个变量接收
# a,b,c,d = ret_demo2()
# print(a,b,c,d)
#
# #python中把用逗号分割的多个值就认为是一个元组
#
# # 函数参数
# def stu_info(name,sex = "male"):
#     """打印学生信息函数，由于班中大部分学生都是男生，
#         所以设置默认参数sex的默认值为'male'
#     """
#     print(name,sex)
#
#
# stu_info('alex')
# stu_info('eva','female')

#动态参数
# def mysum(*args):
#     the_sum = 0
#     for i in args:
#         the_sum+=i
#     return the_sum
#
# the_sum = mysum(1,2,3,4,5)
# print(the_sum)

def stu_info(**kwargs):
    print(kwargs)
    print(kwargs['name'],kwargs['sex'])

stu_info(name='aaron',sex='male')


# 本章小结：
#
# 定义函数的规则：
# 1.定义：def 关键词开头，空格之后接函数名称和圆括号()。
# 2.参数：圆括号用来接收参数。若传入多个参数，参数之间用逗号分割。
# 　　　　参数可以定义多个，也可以不定义。
# 　　　　参数有很多种，如果涉及到多种参数的定义，应始终遵循位置参数、*args、默认参数、**kwargs顺序定义。
# 　　　　如上述定义过程中某参数类型缺省，其他参数依旧遵循上述排序
# 3.注释：函数的第一行语句应该添加注释。
# 4.函数体：函数内容以冒号起始，并且缩进。
# 5.返回值：return [表达式] 结束函数。不带表达式的return相当于返回 None
#
# def 函数名(参数1,参数2,*args,默认参数,**kwargs):
#     """注释：函数功能和参数说明"""
#     函数体
#     ……
#     return 返回值
# 调用函数的规则：

# 复制代码
# 1.函数名()
# 函数名后面+圆括号就是函数的调用。
# 2.参数：
# 圆括号用来接收参数。
# 若传入多个参数：
# 应按先位置传值，再按关键字传值
# 具体的传入顺序应按照函数定义的参数情况而定
# 3.返回值
# 如果函数有返回值，还应该定义“变量”接收返回值
# 如果返回值有多个，也可以用多个变量来接收，变量数应和返回值数目一致
#
# 无返回值的情况：
# 函数名()
#
# 有返回值的情况：
# 变量 = 函数名()
#
# 多个变量接收多返回值：
# 变量1，变量2，... = 函数名()